package chess.piece;

import javax.swing.ImageIcon;
import java.util.ArrayList;
import chess.Position;
import chess.Status;

/**
 * Classe Knight (Cavalo)
 * @author Beatriz Miho Anami
 * @author Lucas Rodrigues Anizelli
 * @author Marcos Okamura Rodrigues
 */
public final class Knight extends Piece{
	/**
	 * Construtor do Cavalo.
	 * @param id		id do cavalo
	 * @param position	posição do cavalo
	 * @param color		cor do cavalo
	 * @param imageIcon	imageIcon do cavalo
	 */
	public Knight(int id, Position position, int color, ImageIcon imageIcon) {
		super(id, position, color, imageIcon);
	}
	
	/**
	 * Retorna a representação do Cavalo em String.
	 * @return string "N"
	 */
	@Override
	public String toString(){
		return "N";
	}
	
	/**
	 * Verifica se o cavalo pode capturar uma peça na posição especificada.
	 * @param position	posição da peça a ser capturada
	 * @return 			o status da captura
	 */
	public Status canCapture(Position position){
		return this.canMove(position);
	}

	/**
	 * Verifica se o cavalo pode ser movido para a posição especificada.
	 * @param position	nova posição do cavalo
	 * @return 			o status do movimento
	 */
	public Status canMove(Position position){ 
		int rowDistance = Math.abs(this.position.getRow() - position.getRow());
		int columnDistance = Math.abs(this.position.getColumn() - position.getColumn());
		if((rowDistance == 1) && (columnDistance == 2)){
			return Status.YES;
		} else if((rowDistance == 2) && (columnDistance == 1)){
			return Status.YES;
		} else {
			return Status.NO;
		}
	}

	/**
	 * Retorna o raio de alcance do cavalo no tabuleiro.
	 * @return	ArrayList com as posições de alcance do cavalo
	 */
	public ArrayList<Position> getRange(){
		ArrayList<Position> arrayList = new ArrayList<Position>();
		int row = position.getRow();
		int column = position.getColumn();
		if(row - 1 >= 0){
			if(column + 2 < NUMBER_OF_COLUMNS){
				arrayList.add(new Position(row - 1, column + 2));
			}
			if(column - 2 >= 0){
				arrayList.add(new Position(row - 1, column - 2));
			}
			if(row - 2 >= 0){
				if(column + 1 < NUMBER_OF_COLUMNS){
					arrayList.add(new Position(row - 2, column + 1));
				}
				if(column - 1 >= 0){
					arrayList.add(new Position(row - 2, column - 1));
				}
			}
		}
		if(row + 1 < NUMBER_OF_ROWS){
			if(column + 2 < NUMBER_OF_COLUMNS){
				arrayList.add(new Position(row + 1, column + 2));
			}
			if(column - 2 >= 0){
				arrayList.add(new Position(row + 1, column - 2));
			}
			if(row + 2 < NUMBER_OF_ROWS){
				if(column + 1 < NUMBER_OF_COLUMNS){
					arrayList.add(new Position(row + 2, column + 1));
				}
				if(column - 1 >= 0){
					arrayList.add(new Position(row + 2, column - 1));
				}
			}
		}
		return arrayList;
	}
}
